#============================================================
#    Fire Buff
#============================================================
# - datetime: 2022-11-23 21:26:51
#============================================================
##火焰魔法buff
##[br]
##[br]放到 DataManagement 节点下边自动连接信号，每次添加属性值和下方的 FireBuff.NAME 的值一样的
##时候会自动添加这个buff
class_name FireBuff
extends DataManagementMonitor


# 叠加的伤害数据
var _damage_data : Array[Dictionary] = []


#============================================================
#  常量
#============================================================
## 当前 Buff 名称常量
const NAME = "火焰魔法BUFF"


## Buff 参数值常量
class BuffParamConsts:
	
	const DURATION = "duration"
	const DAMAGE = "damage"


#============================================================
#  自定义
#============================================================
# 根据添加的数据创建计时器
func _create_timer_by_data(data: Dictionary):
	var timer := Timer.new()
	add_child(timer)
	timer.start(data[BuffParamConsts.DURATION])
	timer.timeout.connect(_timer_timeout.bind(data))
	# 结束删除这个计时器
	timer.timeout.connect(timer.queue_free)
	_damage_data.append(data)


#============================================================
#  连接信号
#============================================================
#(override)
func _newly_added_property(property, value):
	if property == FireBuff.NAME:
		print("-- 新添加buff: ", property)
		set_physics_process(true)
		_create_timer_by_data(value)

#(override)
func _property_changed(property, previous, current):
	# 开始叠加火焰魔法 buff
	if property == FireBuff.NAME:
		print("-- 开始叠加 ", property, " 属性")
		# 额外增加上个 buff 持续时间的一半时间
		current[BuffParamConsts.DURATION] += previous[BuffParamConsts.DURATION] * 0.5
		# 额外增加上个 buff 伤害的一半伤害
		current[BuffParamConsts.DAMAGE] += previous[BuffParamConsts.DAMAGE] * 0.5
		
		_create_timer_by_data(current)

#(override)
func _removed_property(property, value):
	if property == FireBuff.NAME:
		set_physics_process(false)


func _timer_timeout(data):
	print("倒计时结束，造成伤害：", data[BuffParamConsts.DAMAGE])
	
	# 结束时造成伤害
	get_data_management().sub_property(PropertyConsts.HEALTH, data[BuffParamConsts.DAMAGE])
	# 到达时间减去叠加的火焰buff数据，如果没有了，则移除buff状态
	_damage_data.erase(data)
	if _damage_data.is_empty():
		get_data_management().remove_property(NAME)
		print("-- 没有叠加数据了，移除buff")
